package main

import (
	"doubanApp/logger"
	"doubanApp/pie"
	"flag"
	"fmt"
	"os"
	"time"
)

func main() {
	// 加载配置文件
	Init()
	// 加载日志
	// 初始化日志配置
	logger.Init(logger.LogConfig{
		Level:      "debug",
		Filename:   AppConfig.LogPath,
		MaxSize:    100, // MB
		MaxBackups: 3,
		MaxAge:     7, // days
		Compress:   true,
		Console:    false,
		Caller:     true,
	})
	// 使用默认logger
	logg := logger.Default()
	logg.Info("Application starting")

	// 初始化缓存
	cacheDir := AppConfig.Pie.CacheDir
	ttl := time.Duration(AppConfig.Pie.TTL) * 24 * time.Hour
	cache, err := pie.NewFileCache(cacheDir, ttl) // TTL设置为24小时 * 30 一个月
	if err != nil {
		panic(err)
	}

	var url string
	var indexId string
	// 定义布尔类型的命令行标志，默认值 false
	tocPtr := flag.Bool("toc", false, "只显示目录 与 -url 一起使用")
	flag.StringVar(&url, "url", "", "目标URL")
	flag.StringVar(&indexId, "index", "", "显示目录列表")
	flag.Parse()

	if url == "" {
		if indexId == "" {
			fmt.Println("错误: --url 参数 获取书籍信息")
			fmt.Println("错误: --index 参数 获取目录列表")
			flag.Usage()
			os.Exit(1)
		}
	}

	if url == "" {
		if indexId != "" {
			// 执行获取目录列表
			indexKey := indexId + "_toc.json"

			// 从缓存中获取目录信息
			toc, err := cache.GetString(indexKey)
			if err != nil {
				fmt.Printf("获取目录信息失败: %v\n", err)
				return
			}
			info, err := clearTocInfo(toc)
			if err != nil {
				return
			}
			fmt.Print(info)
			os.Exit(0)
		}
		os.Exit(1)
	}

	// 豆瓣书籍URL
	rawURL := "https://book.douban.com/subject/37095757/"

	// 获取Url
	if url != "" {
		rawURL = url
	}
	logg.Infof("url = %s\n", rawURL)
	// 提取书籍ID
	bookID := extractBookID(rawURL)
	if bookID == "" {
		fmt.Println("无法从URL中提取书籍ID")
		return
	}

	rawURL = fmt.Sprintf("https://book.douban.com/subject/%s/", bookID)
	logg.Infof("found targer url = %s", rawURL)

	htmlContent := ""
	infoKey := bookID + "_info.json"
	tocKey := bookID + "_toc.json"

	if !cache.Exists(infoKey) || !cache.Exists(tocKey) {
		// 获取网页内容
		htmlContent, err = fetchHTML(rawURL)
		if err != nil {
			logg.Infof("获取网页内容失败: %v\n", err)
			return
		}
		logg.Info("get html content success")
	}

	if !cache.Exists(infoKey) {
		// 解析书籍信息
		bookInfo, err := parseBookInfo(htmlContent, bookID)
		if err != nil {
			logg.Infof("解析书籍信息失败: %v\n", err)
			return
		}
		logg.Info("get book info success")

		// 写入缓存
		err = saveAsJSON(logg, cache, bookInfo, infoKey)
		if err != nil {
			logg.Infof("保存书籍信息失败: %v\n", err)
			return
		}
		logg.Info("save book cache success")
	}

	if !*tocPtr {
		// 没有toc参数,默认打印书籍信息
		stringInfo, err := cache.GetString(infoKey)
		if err != nil {
			return
		}
		fmt.Print(stringInfo)
	}

	if !cache.Exists(tocKey) {
		// 解析目录信息
		toc, err := parseTOC(htmlContent, bookID)
		if err != nil {
			logg.Infof("解析目录失败: %v\n", err)
			return
		}
		logg.Info("get toc success")

		err = saveAsJSON(logg, cache, toc, tocKey)
		if err != nil {
			fmt.Printf("保存目录信息失败: %v\n", err)
			return
		}
		logg.Info("save toc cache success")
	}

	// 打印目录信息
	if *tocPtr {
		stringInfo, err := cache.GetString(tocKey)
		if err != nil {
			return
		}
		fmt.Print(stringInfo)
	}
}
